package com.guyj.common.application;

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.multidex.MultiDex;

//import com.antfortune.freeline.FreelineCore;
import com.google.gson.Gson;
import com.guyj.common.utils.BaseUtils;
import com.guyj.common.utils.ImageLoadManager;
import com.lzy.okhttputils.OkHttpUtils;
import com.lzy.okhttputils.cache.CacheEntity;
import com.lzy.okhttputils.cache.CacheMode;
import com.orhanobut.logger.LogLevel;
import com.orhanobut.logger.Logger;
//import com.squareup.leakcanary.LeakCanary;

import java.io.File;

import cn.finalteam.galleryfinal.CoreConfig;
import cn.finalteam.galleryfinal.FunctionConfig;
import cn.finalteam.galleryfinal.GalleryFinal;
import cn.finalteam.galleryfinal.ImageLoader;
import cn.finalteam.galleryfinal.PauseOnScrollListener;
import cn.finalteam.galleryfinal.ThemeConfig;
import cn.finalteam.galleryfinal.widget.GFImageView;


public class App extends Application{

    private static App mApp;
    public static App getInstance() {
        return mApp;
    }

    private static Gson mGson;

    public static Gson getGson() {
        return mGson;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mApp=this;
        mGson = new Gson();
        if (BaseUtils.isDebug){
//            FreelineCore.init(this);//增量编译

//            LeakCanary.install(this);//内存泄露检查工具
            /**
             * 日志打印
             */
            initLogger();
        }
        /**
         * okhttp
         */
        initOkHttp();
        /**
         * 图片选择器
         */
        initImagePicker();
    }

    private void initImagePicker() {
        //设置主题
        ThemeConfig theme = ThemeConfig.DARK;
//        ThemeConfig theme = new ThemeConfig.Builder()
//                .build();自定义主题
        //配置功能
        FunctionConfig functionConfig = new FunctionConfig.Builder()
                .setEnableCamera(true)
                .setEnableEdit(true)
                .setEnableCrop(true)
                .setEnableRotate(false)
                .setCropSquare(false)
                .setEnablePreview(true)
                .setMutiSelectMaxSize(9)

                .build();
        CoreConfig coreConfig = new CoreConfig.Builder(this, new ImageLoader() {

            @Override
            public void displayImage(Activity activity, String path, GFImageView imageView, Drawable defaultDrawable, int width, int height) {
                ImageLoadManager.intoForImagePicker(path,imageView,defaultDrawable,defaultDrawable);
            }

            @Override
            public void clearMemoryCache() {

            }
        }, theme)
                .setFunctionConfig(functionConfig)
                .setPauseOnScrollListener(new PauseOnScrollListener(true, true) {
                    @Override
                    public void resume() {
                        ImageLoadManager.resumeLoad();
                    }

                    @Override
                    public void pause() {
                        ImageLoadManager.pauseLoad();
                    }
                })
                .setNoAnimcation(true)
                .build();
        GalleryFinal.init(coreConfig);
    }

    private void initOkHttp() {
        OkHttpUtils.init(this);
        if (BaseUtils.isDebug){
            try {
                //以下都不是必须的，根据需要自行选择,一般来说只需要 debug,缓存相关,cookie相关的 就可以了
                OkHttpUtils.getInstance()

                        //打开该调试开关,控制台会使用 红色error 级别打印log,并不是错误,是为了显眼,不需要就不要加入该行
                        .debug("OkHttpUtils")

                        //如果使用默认的 60秒,以下三行也不需要传
                        .setConnectTimeout(OkHttpUtils.DEFAULT_MILLISECONDS)  //全局的连接超时时间
                        .setReadTimeOut(OkHttpUtils.DEFAULT_MILLISECONDS)     //全局的读取超时时间
                        .setWriteTimeOut(OkHttpUtils.DEFAULT_MILLISECONDS)    //全局的写入超时时间

                        //可以全局统一设置缓存模式,默认就是Default,可以不传,具体其他模式看 github 介绍 https://github.com/jeasonlzy0216/
                        .setCacheMode(CacheMode.FIRST_CACHE_THEN_REQUEST)

                        //可以全局统一设置缓存时间,默认永不过期,具体使用方法看 github 介绍
                        .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE);

                //如果不想让框架管理cookie,以下不需要
//                .setCookieStore(new MemoryCookieStore())                //cookie使用内存缓存（app退出后，cookie消失）
//                    .setCookieStore(new PersistentCookieStore())          //cookie持久化存储，如果cookie不过期，则一直有效

                //可以设置https的证书,以下几种方案根据需要自己设置,不需要不用设置
//                    .setCertificates()                                  //方法一：信任所有证书
//                    .setCertificates(getAssets().open("srca.cer"))      //方法二：也可以自己设置https证书
//                    .setCertificates(getAssets().open("aaaa.bks"), "123456", getAssets().open("srca.cer"))//方法三：传入bks证书,密码,和cer证书,支持双向加密

                //可以添加全局拦截器,不会用的千万不要传,错误写法直接导致任何回调不执行
//                .addInterceptor(new Interceptor() {
//                    @Override
//                    public Response intercept(Chain chain) throws IOException {
//                        return chain.proceed(chain.request());
//                    }
//                })

                //这两行同上,不需要就不要传
//                    .addCommonHeaders(headers)                                         //设置全局公共头
//                    .addCommonParams(params);                                          //设置全局公共参数
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else{
            try {
                OkHttpUtils.getInstance()
                        //如果使用默认的 60秒,以下三行也不需要传
                        .setConnectTimeout(OkHttpUtils.DEFAULT_MILLISECONDS)  //全局的连接超时时间
                        .setReadTimeOut(OkHttpUtils.DEFAULT_MILLISECONDS)     //全局的读取超时时间
                        .setWriteTimeOut(OkHttpUtils.DEFAULT_MILLISECONDS)    //全局的写入超时时间
                        //可以全局统一设置缓存模式,默认就是Default,可以不传,具体其他模式看 github 介绍 https://github.com/jeasonlzy0216/
                        .setCacheMode(CacheMode.FIRST_CACHE_THEN_REQUEST)
                        //可以全局统一设置缓存时间,默认永不过期,具体使用方法看 github 介绍
                        .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE);
            }catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

    private void initLogger() {
        Logger
                .init("log")                      // default PRETTYLOGGER or use just init()
                .methodCount(2)                 // default 2
               // .hideThreadInfo()               // default shown
                .logLevel(LogLevel.FULL)        // default LogLevel.FULL,release版用NULL
                .methodOffset(0);               // default 0
        // default AndroidLogAdapter
    }

    @Override
    protected void attachBaseContext(Context context) {
        super.attachBaseContext(context);
        MultiDex.install(this);//分包用
    }

    private File singleChooseFile;
    public File getSingleChooseFile() {
        return singleChooseFile;
    }
    public void setSingleChooseFile(File singleChooseFile) {
        if(singleChooseFile ==null){//释放并删除已有图片
            if(this.singleChooseFile!=null && this.singleChooseFile.exists()){
                this.singleChooseFile.delete();
            }
        }else{
            this.singleChooseFile = singleChooseFile;
        }
    }
}
